\chapter{Term软件专题}
前面讲述的BBS操作在任何终端下都能完成，但是它们有下列局限：
\begin{enumerate}
	\item 没有快捷键的设置，没有充分利用鼠标、触摸板甚至触摸屏的功能。
	\item 没有对带色彩效果的文字进行操作的功能。
	\item 有时会出现排版问题。\footnote{这是因为终端高度没调整好。}
	\item 普通的终端默认编码是UTF-8,上BBS需要转码。
		\footnote{IRC上的一个网友说，用GBK编码是传统“中国大陆”BBS的特点。}
	\item 登录了多个会话时切换不方便。
	\item 扩展性不足。
	\item \ldots
\end{enumerate}

因此，很多用户都会使用专门的软件上BBS,这就是各种Term软件了。
\footnote{之所以放在最后讲，是因为对一般的用户，之前的内容已经足够，而且不想给读者造成上BBS必须用Term软件的印象。}
因篇幅关系，本手册选用开源而且能在多种系统下使用的FQTerm.

\section{FQTerm简介和安装}
FQTerm是一个开源的BBS Term软件，可在Windows,Linux,Mac,FreeBSD等系统下使用。FQTerm有着一个BBS终端的常用功能，
如彩色复制粘贴，快捷键，脚本，防发呆。FQTerm支持Telnet/SSH协议。

要安装FQTerm,可以去FQTerm的项目主页下载安装包，然后安装。
\begin{itemize}
	\item Windows(x86): \url{http://fqterm.googlecode.com/files/FQTerm-0.9.8.2-win32-installer.exe}
	\item Mac OS(x86\_64): \url{http://fqterm.googlecode.com/files/fqterm-0.9.8.2-x86\_64.dmg}
	\item 其他系统(Linux,BSD或非x86平台)的用户可以在软件源找FQTerm的软件包，如果没有可以从源码编译安装。
\end{itemize}

\section{FQTerm基本功能}
\subsection{彩色复制粘贴}
要在FQTerm中使用彩色复制粘贴，首先要确保已经打开了彩色复制选项，如果没有就把它打开（如图）。
\begin{figure}[htbp]
	\centering
	\includegraphics{images/colorcopy.png}
	\caption{彩色复制选项}
\end{figure}
接着，随便复制些内容，然后发文章，在发文窗口中粘贴，然后按Esc-c键预览，看看是不是已经成功地使用了彩色复制粘贴功能了？

一般的Term软件还有矩形选择功能，把矩形选择功能打开，然后试着选一个区域，看看这个区域是不是矩形？
\footnote{练习：到主选单，把北大西门的图案复制下来，放到自己的个人文集里。}

\subsection{快捷键设置}
在FQTerm的工具栏上找到\includegraphics[height=10pt]{images/setup_shortcuts.png}按钮，点击它就可以设置快捷键。

要设置快捷键，首先想好你要做的操作要按键盘上的哪些键，把它们记下来，如版务常用的合集操作要依次按下b,1,回车
\footnote{常记为C-M, 即'$\backslash$r', 或C-J,即'$\backslash$n'.},7,回车,y,三次回车，设置的快捷键如图所示。
\begin{figure}[htbp]
	\centering
	\includegraphics[scale=0.7]{images/shortcuts.png}
	\caption{合集的快捷键设置}
\end{figure}

\subsection{图像查看}
FQTerm自带一个图像查看器，当帖子中出现了图片的链接时，直接点击该链接，图像查看器便会自动下载该图片，并且显示图片。
\subsection{IP所在地查询}
要查询IP所在地，首先需要IP数据库。目前最流行的数据库是纯真IP数据库，可以到\url{http://www.cz88.net/}下载最新的IP数据库，
不过这是一个软件包，需要在安装后把其中的qqwry.dat复制出来。也可以直接在网上搜索qqwry.dat,往往能直接下到包含这个文件的压缩包。

找到qqwry.dat后，按照FQTerm的文档把它复制到指定目录（Windows下一般为安装目录，*nix下是\$HOME/.fqterm），重启FQTerm就可以用了。
要查询IP所在地时，直接鼠标指向IP地址即可。

\section{FQTerm脚本编写}
FQTerm自带脚本引擎，可以用JavaScript作扩展语言，在此由于篇幅关系不做介绍。详情可见FQTerm软件包中的一些例子。

% not going to use these
\begin{comment}
FQTerm自带脚本引擎，支持JavaScript,有的版本还支持Python. 本节介绍JavaScript的编写。
\subsection{JavaScript基础}
\subsubsection{JavaScript介绍}
JavaScript(简称js)是一种广泛用于网页开发的脚本语言。JavaScript虽然名字里面有Java\footnote{是Netscape为营销考虑与Sun达成协议的结果},
但是它的设计和Java很不一样。JavaScript虽然语法像C,但它却是种弱类型，函数式的语言，被称为披着C语言外衣的LISP.
\footnote{@vimacs是LISP爱好者，曾用自己的ViLISP写了个煮咖啡的程序，但是没有煮出一滴咖啡！}
\subsubsection{编写方法}
上面已经说过，JavaScript的语法和C/C++很相似，只要你熟悉C语言，就可以很快学会JavaScript.

首先，JavaScript是种弱类型的语言，就是说JavaScript中的变量不需要指定类型\footnote{事实上，JavaScript解释器会自动推导变量类型。}。js中用\emph{var}关键字定义类型，如：
\begin{verbatim}
var i=0;
\end{verbatim}

JavaScript是种函数式语言，函数是一种类型，定义函数需要\emph{function}关键字，如定义一个函数，计算从1到n的连续整数的和：
\begin{Verbatim}
sum_of_int = function(n){
	var s = 0;
	for (var i=0; i<=n; ++i){
		s += i;
	}
	return s;
}
\end{Verbatim}

相信大家已经了解js的写法了，下面就是要把它用在FQTerm上，下面介绍FQTerm的脚本引擎提供的一些函数。它们使用时都要加上
前缀\emph{fqterm},如fqterm.importFile,fqterm.msgBox等，以下函数都省略该前缀。
\begin{enumerate}
\item msgBox(str) 弹出一个窗口，内容为str指定的字符串
\item readFile(str) 读入一个文件，返回文件文件的内容（一个字符串）
\item writeFile(filename,str),appendFile(filename,str) 写文件（新建或覆盖该文件），往文件追加内容，文件名为filename,写入或追加的内容为str指定的字符串
\item caretX(),caretY() 光标所在的X坐标，Y坐标（从0开始计数）
\item getText(n),getAttrText(n) 获得第n行（从0开始）的内容，返回一个字符串，不过getAttrText返回的字符串包含ASCII控制序列，
其中的Escape字符"\verb|\x1b[|"被处理为"\verb|\x1b\x1b|"
\item sendString(str) 直接把字符串str的每个字符发送到term上
\item sendParsedString(str) 把字符串str的内容进行解释后发到term上，这里的“解释”主要指字符串到按键的转换，如Ctrl键为"\^{}",
Esc键为"\verb|^[|"
\item importFile(filename) 导入文件名为filename的JavaScript脚本

利用JavaScript语言和Term软件自带的函数，可以写出很多实用的脚本。这些脚本也可以设置成快捷键，方法和设定按键快捷键相似。
\end{enumerate}


\subsection{例：抢整脚本的编写}
以下我们将用FQTerm的JavaScript脚本实现一键抢整功能，为了方便，我们实现最基本的功能，即发一个标题为文章ID的空白文章。
\footnote{再次提醒，不是每个版都允许抢整!}

首先，为了获得文章ID，我们要先找到最后一篇文章的ID. 通过帮助可以发现，按\$键就可以跳到最后一篇文章。于是可以写
\begin{verbatim}
fqterm.sendString("$"); //last post
\end{verbatim}

按下\$后，光标就跳到了最后一篇文章的所在行，我们先把这一行的内容保存下来。由于按键和光标位置移动有时间差，我们可以先暂停0.1秒，
在FQTerm这个软件包里面有一个utils.js,里面有一个sleep函数用于使脚本暂停一段时间。以上操作代码如下：
\begin{verbatim}
sleep(100);
var thisLine = fqterm.getText(fqterm.caretY());
\end{verbatim}

然后我们把字符串thisLine中的第一个数提取出来，就是最后一篇文章的ID,把它加个1就得到要发的文章的ID了。这时，我们可以用
正则表达式获得第一个数\footnote{本手册不打算介绍正则表达式，请自行查阅相关资料。}。
\begin{verbatim}
var reg = new RegExp('[0-9]{1,}');
lastID = reg.exec(thisLine);
\end{verbatim}

把以上的内容写成一个函数，用于获得最后一篇文章的ID,主要先导入utils.js.
\begin{Verbatim}
fqterm.importFile("utils.js");

lastPost=function(){
	fqterm.sendString("$"); //last post
	sleep(100);
	var thisLine = fqterm.getText(fqterm.caretY());
	var reg = new RegExp('[0-9]{1,}');
	return reg.exec(thisLine);
}
\end{Verbatim}

获得最后一篇文章的ID后，抢整就是发一篇空文章，标题为这个ID加1,代码如下：
\begin{Verbatim}
qz=function(){
	articleID = lastPost();
	++articleID;
	postEmpty(articleID);
}
\end{Verbatim}

其中postEmpty函数的作用是发空文章，具体做法是按下C-P,输入标题，两次回车后按C-W保存，回车，代码如下：
\begin{Verbatim}
postEmpty=function(title){
	fqterm.sendParsedString("^p");
	fqterm.sendString(title);
	fqterm.sendParsedString("\n\n^W\n");
}
\end{Verbatim}

把以上代码综合在一起，并在文件末尾加上qz(),保存为qz.js,这样就得到一个抢整脚本了。把qz.js和utils.js放在一个目录中，
在FQTerm中上Water版，按F7键，选中qz.js运行，看看抢整的效果。
\begin{figure}[htbp]
	\centering
	\includegraphics[scale=0.7]{images/qz.png}
	\caption{抢整脚本代码}
\end{figure}

脚本测试完成后，增加一个快捷键，这样就可以一键抢整了。
\begin{figure}[htbp]
	\centering
	\includegraphics[scale=0.7]{images/script-key.png}
	\caption{设置脚本快捷键}
\end{figure}

\end{comment} % the comment part end

\section{总结}
现在我们来总结一下，使用Term软件和直接Telnet/SSH相比有什么不同。
\begin{enumerate}
\item Term软件针对BBS编写\footnote{主要是国内高校用的Firebird BBS系统}，对BBS有一套解决方案，比如防发呆，点击帖子直接浏览等功能。
\item 有彩色字体复制粘贴的功能。
\item 加强了和WWW模式的结合，如链接点击，图片浏览。
\item 可以设置快捷键。
\item 支持脚本，常见的有JavaScript,Python等。
\end{enumerate}

